package com.shuziren.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shuziren.entity.BackgroundUser;
import com.shuziren.entity.vo.BavkgroundUserVo;
import com.shuziren.mapper.BackgroundUserMapper;
import com.shuziren.service.BackgroundUserService;
import com.shuziren.interceptor.JWTTokenUtil;
import com.shuziren.service.RedisService;
import com.shuziren.vo.LoginVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class BackgroundUserServiceImpl extends ServiceImpl<BackgroundUserMapper, BackgroundUser> implements BackgroundUserService {

    @Autowired
    private BackgroundUserMapper backgroundUserMapper;

    @Autowired
    private RedisService redisService;

    @Override
    public int saveloginlog(BackgroundUser user) {
        UpdateWrapper<BackgroundUser> backgroundUserUpdateWrapper = new UpdateWrapper<>();
        backgroundUserUpdateWrapper.set("last_login_time", new Date())
                .set("last_login_ip", user.getLastLoginIp())
                .set("ip_attribution", user.getIpAttribution()).eq("id", user.getId());
        int update = backgroundUserMapper.update(backgroundUserUpdateWrapper);
        return update;
    }

    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户信息
     */
    @Override
    public BackgroundUser findByUsername(String username) {
        // 自定义查询字段，避免查询 token 字段
        return lambdaQuery()
                .select(BackgroundUser.class, info -> !info.getColumn().equals("token"))
                .eq(BackgroundUser::getUsername, username)
                .one();
    }

    /**
     * 注册新用户
     * @param user 用户信息
     */
    @Override
    public void register(BackgroundUser user) {
        // 校验邮箱不能为空
        if (user.getEmail() == null || user.getEmail().isEmpty()) {
            throw new IllegalArgumentException("邮箱不能为空");
        }

        // 检查用户名是否已存在
        BackgroundUser existingUser = findByUsername(user.getUsername());
        if (existingUser != null) {
            throw new IllegalArgumentException("用户名已存在");
        }

        // 设置默认状态为 1
        user.setStatus("1");

        // 设置创建时间和更新时间为当前时间
        user.setCreatedAt(new Date());
        user.setUpdatedAt(new Date());

        // 对密码进行MD5加密
        String encryptedPassword = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
        user.setPassword(encryptedPassword);

        // 确保id字段由数据库自动生成
        user.setId(null);

        // 使用insert方法插入用户信息，确保ID由数据库自动生成
        backgroundUserMapper.insert(user);

    }

    /**
     * 更新用户信息
     * @param user 用户信息
     */
    @Override
    public void update(BackgroundUser user) {
        updateById(user);
    }

    /**
     * 根据ID删除用户
     * @param id 用户ID
     */
    @Override
    public void deleteById(Integer id) {
        removeById(id);
    }

    /**
     * 查找所有用户
     * @return 用户列表
     */
    @Override
    public List<BackgroundUser> findAll() {
        // 自定义查询字段，避免查询 token 字段
        return lambdaQuery()
                .select(BackgroundUser.class, info -> !info.getColumn().equals("token"))
                .list();
    }

    /**
     * 用户登录
     * @param loginVo 登录信息
     * @return 用户信息
     */
    @Override
    public BavkgroundUserVo login(LoginVo loginVo) {
        loginVo.validate();

        String password = loginVo.getPassword();
        String password1 = "."+password+".";

        // 自定义查询字段，避免查询 token 字段
        BackgroundUser user = lambdaQuery()
                .select(BackgroundUser.class, info -> !info.getColumn().equals("token"))
                .eq(BackgroundUser::getUsername, loginVo.getUsername())
                .eq(BackgroundUser::getPassword, password1)
                .one();
        BavkgroundUserVo bavkgroundUserVo = new BavkgroundUserVo();
        BeanUtils.copyProperties(user, bavkgroundUserVo);
        if (bavkgroundUserVo != null) {
            // 生成Token并设置到user对象中
            bavkgroundUserVo.setToken(JWTTokenUtil.createToken(user.getUsername()));
            redisService.set("OnlineUser:"+bavkgroundUserVo.getUsername(), bavkgroundUserVo.getToken(), 60*60*24*7L);
        }
        return bavkgroundUserVo;
    }

    @Override
    public boolean changePassword(Integer id, String oldPassword, String newPassword) {
        // 校验新密码不能为空
        if (newPassword == null || newPassword.isEmpty()) {
            throw new IllegalArgumentException("新密码不能为空");
        }

        // 查找用户
        BackgroundUser user = getById(id);
        if (user == null) {
            throw new IllegalArgumentException("用户不存在");
        }

        // 对旧密码进行MD5加密
        String encryptedOldPassword = DigestUtils.md5DigestAsHex(oldPassword.getBytes());

        // 验证旧密码是否正确
        if (!user.getPassword().equals(encryptedOldPassword)) {
            throw new IllegalArgumentException("旧密码不正确");
        }

        // 对新密码进行MD5加密
        String encryptedNewPassword = DigestUtils.md5DigestAsHex(newPassword.getBytes());
        user.setPassword(encryptedNewPassword);

        // 更新用户信息
        updateById(user);
        return true;
    }

    /**
     * 退出登入删除token
     * @param token,username
     * @return
     */
    @Override
    public boolean loginout(String token,String username) {
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }
        Object o = redisService.get("OnlineUser:" + username);
        String token1 = o.toString();
        if (token.equals(token1)){
            Boolean del = redisService.del("OnlineUser:" + username);
            if (del){
                return true;
            }
        }

        return false;
    }
}